/*
 * ULSF Sagittarius IDA
 * Copyright (C) 2012, John Pritchard, all rights reserved.
 * 
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see
 * <http://www.gnu.org/licenses/>.
 */
package sagittarius.design;

/**
 * A {@link Section} shape path model may have the objective area, or
 * an unrelated ideal area.
 * 
 * <p> The vertex sets of a model are a two dimensional (Y,Z)+ closed
 * path polygon.  The path order has a counterclockwise (CCW) path
 * winding from Y+ to Y- under Z+ (top), and back from Y- to Y+ under
 * Z- (bottom).  The first vertex equals last vertex.  The path has a
 * shared midpoint: for top with T vertices, bottom has (T-1)
 * vertices. </p>
 * 
 * <p> All of the {@link Model} and {@link Section} vertex sets
 * employed within a {@link Volume} must have the same number of
 * vertices in their (polygon path) sets. </p>
 * 
 * @see Visualization
 * @see Section
 * @see Model$AbstractModel
 * @see Model$SectionModel
 */
public interface Model {
    /**
     * Number of vertices in the top half of a model vertex set.
     */
    public final static int Top = 20;

    /**
     * This kind of model generates an abstract polygon path which is
     * scaled for an objective {@link Section}.
     */
    public interface Path
        extends Model
    {

        public float getPathArea();

        public float[] getPathVertices();
    }
    /**
     *
     */
    public interface Hyperbolic
        extends Model.Path
    {
        /**
         * @return Hyperbolic arc sector as the maximal coordinate in the
         * domain of the source hyperbola
         */
        public float getHyperbolicSector();
        /**
         * @return Ratio of this sector to max sector for longitudinal model class
         */
        public float getHyperbolicSectorRatio();
    }
    /**
     * This kind of model generates a polygon path for the objective
     * section.
     */
    public interface Sectional
        extends Model
    {

        public float getSectionalArea();

        public float[] getSectionalVertices();
    }


    public boolean isPath();

    public boolean isSectional();

    public boolean isHyperbolic();

    public float[] getVerticesFor(float area, float radius);
}
